import Vue from 'vue'
import VueRouter from 'vue-router'
//引入路径数组
import routes from './routes.js';
Vue.use(VueRouter)
//引入store
import store from '@/store';


let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;

//手写push replace 防止重复进入报错
VueRouter.prototype.push = function (location, resolve, reject) {
  if (resolve && reject) {
    originPush.call(this, location, resolve, reject)
  }
  else {
    originPush.call(this, location, () => { }, () => { })

  }
}

VueRouter.prototype.replace = function (location, resolve, reject) {
  if (resolve && reject) {
    originReplace.call(this, location, resolve, reject)
  }
  else {
    originReplace.call(this, () => { }, () => { })

  }
}

//创建实例
const router = new VueRouter({
  routes,
  scrollBehavior(to, from, savedPosition) {
    // 始终滚动到顶部
    return { y: 0 }
  },
})
//全局守卫：前置守卫(路由跳转之前)
router.beforeEach(async (to, from, next) => {
  let token = store.state.user.token;
  let name = store.state.user.userInfo.name;
  //本地存储了token
  if (token) {
    //判断是不是去的login，是直接跳转'/'
    if (to.path == '/login')
      next('/')
    else {
      //判断仓库中有没有用户信息，当时只有home派发了action，其他页面刷新就会清除仓库，一开始的解决办法是在所有路由组件的monted生命周期函数中派发action，但是现在只要是路由跳转且仓库没有存储用户信息，就直接发送请求，一劳永逸
      if (name) next()
      else {
        try {
          //获取用户信息
          await store.dispatch("getUserInfo");
          next()
        } catch (error) {
          //当服务器存的token过期了，就会执行这里，清除本地存储的token，和仓库中的token及其用户信息，重定向到登录页面
          await store.dispatch("userLogout")
          next('/login')
        }
      }
    }
  } else {
    //未登录，不能去交易相关的，支付相关的【pay,payseccess】,不能去个人中心【center】
    //重定义到登录页面，【login】
    const toPath = to.path
    if (toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1)
      next('/login?redirect=' + toPath)
    else
      next()
  }
})

//暴露router
export default router